# Python面向对象编程：继承与多态

"""
继承与多态是面向对象编程的两个重要概念：

1. 继承（Inheritance）：
   - 允许创建一个类（子类）继承另一个类（父类）的属性和方法
   - 子类可以重用父类的代码，提高代码复用性
   - 子类可以添加新的属性和方法，扩展父类的功能

2. 多态（Polymorphism）：
   - 不同的子类对象调用相同的方法，但表现出不同的行为
   - 增加代码的灵活性和可扩展性
   - 符合"开放封闭原则"：对扩展开放，对修改封闭
"""


# 定义一个基类（父类）：动物类
class Animal:
    def __init__(self, name, age):
        self.name = name  # 动物的名字
        self.age = age  # 动物的年龄

    def make_sound(self):
        """发出声音（父类中的方法）"""
        print("动物发出声音")

    def show_info(self):
        """显示动物信息"""
        print(f"这是一只{self.age}岁的{self.name}")


# 定义一个子类：狗类
class Dog(Animal):  # 在括号中指定父类，表示继承Animal类
    def __init__(self, name, age, breed):
        # 调用父类的__init__方法
        super().__init__(name, age)
        self.breed = breed  # 狗的品种（子类特有的属性）

    # 重写（覆盖）父类的方法，实现多态
    def make_sound(self):
        print(f"{self.name}汪汪叫！")

    # 子类特有的方法
    def fetch_ball(self):
        print(f"{self.name}在追球！")


# 定义另一个子类：猫类
class Cat(Animal):
    def __init__(self, name, age, color):
        super().__init__(name, age)
        self.color = color  # 猫的毛色（子类特有的属性）

    # 重写父类的方法
    def make_sound(self):
        print(f"{self.name}喵喵叫！")

    # 子类特有的方法
    def catch_mouse(self):
        print(f"{self.name}在抓老鼠！")


# 创建实例并测试
if __name__ == "__main__":
    # 创建一个狗的实例
    dog = Dog("旺财", 3, "金毛")
    dog.show_info()  # 调用继承自父类的方法
    dog.make_sound()  # 调用重写后的方法
    dog.fetch_ball()  # 调用子类特有的方法
    print(f"狗的品种是：{dog.breed}")  # 访问子类特有的属性

    print("\n" + "-" * 30 + "\n")

    # 创建一个猫的实例
    cat = Cat("咪咪", 2, "橘色")
    cat.show_info()  # 调用继承自父类的方法
    cat.make_sound()  # 调用重写后的方法
    cat.catch_mouse()  # 调用子类特有的方法
    print(f"猫的毛色是：{cat.color}")  # 访问子类特有的属性

    print("\n" + "-" * 30 + "\n")

    # 演示多态
    def animal_sound(animal):
        """函数参数是父类类型，但实际可接收任何子类对象"""
        animal.make_sound()

    # 不同对象调用相同的方法，表现出不同的行为
    print("演示多态：")
    animal_sound(dog)  # 会输出狗叫声
    animal_sound(cat)  # 会输出猫叫声

"""
通过上面的代码，我们可以看到：

1. 继承的优点：
   - Dog和Cat类继承了Animal类的属性（name, age）和方法（show_info）
   - 子类可以添加自己特有的属性（breed, color）和方法（fetch_ball, catch_mouse）
   - 代码复用，避免重复编写相同的代码

2. 多态的体现：
   - Dog和Cat类都重写了make_sound方法，实现了各自的叫声
   - animal_sound函数可以接收任何Animal类的子类对象
   - 不同的对象调用相同的方法会产生不同的结果

这就是面向对象编程的灵活性和可扩展性的体现。
"""
